﻿using DevComponents.DotNetBar.SuperGrid.SuperGrid;
using Kimd.Common;
using Kimd.Communication;
using Kimd.Logic;
using Kimd.Machine;
using Kimd.Motion;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WorkStation.Common;

namespace WorkStation.Logic
{
    public class RobotStatusLogic : FlowBase
    {
        private bool[] _robotInStatus = new bool[56];
        private bool[] writeStatus = new bool[56];
        private TCPClient _robotClient;
        private Pdo _robotReadAddress1;
        private Pdo _robotReadAddress2;
        private Pdo _robotReadAddress3;
        private Pdo _robotReadAddress4;
        private Pdo _robotReadAddress5;
        private Pdo _robotReadAddress6;
        private Pdo _robotReadAddress7;

        private bool _isFront;
        public Dictionary<int, string> RobotInEnumRobot1Dict;
        public Dictionary<int, string> RobotOutEnumRobot1Dict;
        public RobotStatusLogic(string flowName, FlowManager flowmanager, bool isFront) 
            : base(flowName, flowmanager)
        {
            this._isFront = isFront;
            //if (isFront)
            {
                if (MachineResource.Instance.MachineTcpClient.ContainsKey("机械手状态1"))
                {
                    _robotClient = MachineResource.Instance.MachineTcpClient["机械手状态1"];
                }
                _robotReadAddress1 = new Pdo(MachineResource.Instance.MachineCard["card1"].Description, 2, 0, "机器人读地址1", "Robot1模组");
                _robotReadAddress1.Card = MachineResource.Instance.MachineCard["card1"];
                _robotReadAddress2 = new Pdo(MachineResource.Instance.MachineCard["card1"].Description, 2, 1, "机器人读地址2", "Robot1模组");
                _robotReadAddress2.Card = MachineResource.Instance.MachineCard["card1"];
                _robotReadAddress3 = new Pdo(MachineResource.Instance.MachineCard["card1"].Description, 2, 2, "机器人读地址3", "Robot1模组");
                _robotReadAddress3.Card = MachineResource.Instance.MachineCard["card1"];
                _robotReadAddress4 = new Pdo(MachineResource.Instance.MachineCard["card1"].Description, 2, 3, "机器人读地址4", "Robot1模组");
                _robotReadAddress4.Card = MachineResource.Instance.MachineCard["card1"];
                _robotReadAddress5 = new Pdo(MachineResource.Instance.MachineCard["card1"].Description, 2, 4, "机器人读地址5", "Robot1模组");
                _robotReadAddress5.Card = MachineResource.Instance.MachineCard["card1"];
                _robotReadAddress6 = new Pdo(MachineResource.Instance.MachineCard["card1"].Description, 2, 5, "机器人读地址6", "Robot1模组");
                _robotReadAddress6.Card = MachineResource.Instance.MachineCard["card1"];
                _robotReadAddress7 = new Pdo(MachineResource.Instance.MachineCard["card1"].Description, 2, 6, "机器人读地址7", "Robot1模组");
                _robotReadAddress7.Card = MachineResource.Instance.MachineCard["card1"];
            }
            //else
            {
                
            }

            RobotInEnumRobot1Dict = new Dictionary<int, string>();
            foreach (var item in Enum.GetValues(typeof(RobotinEnumRobot1)))
            {
                RobotInEnumRobot1Dict.Add((int)item, EnumHelper.GetEnumDescriptionFromValue((RobotinEnumRobot1)item));
            }


            RobotOutEnumRobot1Dict = new Dictionary<int, string>();
            foreach (var item in Enum.GetValues(typeof(RobotoutEnumRobot1)))
            {
                RobotOutEnumRobot1Dict.Add((int)item, EnumHelper.GetEnumDescriptionFromValue((RobotoutEnumRobot1)item));
            }
        }
        public override void Home()
        {
            base.Home();
        }
        public override void Init(out string errInfo)
        {
            errInfo = "";
        }
        public override void Method()
        {
            if (!GlobalVariable.RobotCommDisable)
            {
                int val1 = _robotReadAddress1.ReadData();
                int val2 = _robotReadAddress2.ReadData();
                int val3 = _robotReadAddress3.ReadData();
                int val4 = _robotReadAddress4.ReadData();
                int val5 = _robotReadAddress5.ReadData();
                int val6 = _robotReadAddress6.ReadData();
                int val7 = _robotReadAddress7.ReadData();

                for (int i = 0; i < 8; i++)
                {
                    _robotInStatus[i] = ((val1 >> i) & 0x01) == 1;
                }
                for (int i = 0; i < 8; i++)
                {
                    _robotInStatus[i + 8] = ((val2 >> i) & 0x01) == 1;
                }
                for (int i = 0; i < 8; i++)
                {
                    _robotInStatus[i + 16] = ((val3 >> i) & 0x01) == 1;
                }
                for (int i = 0; i < 8; i++)
                {
                    _robotInStatus[i + 24] = ((val4 >> i) & 0x01) == 1;
                }
                for (int i = 0; i < 8; i++)
                {
                    _robotInStatus[i + 32] = ((val5 >> i) & 0x01) == 1;
                }
                for (int i = 0; i < 8; i++)
                {
                    _robotInStatus[i + 40] = ((val6 >> i) & 0x01) == 1;
                }
                for (int i = 0; i < 8; i++)
                {
                    _robotInStatus[i + 48] = ((val7 >> i) & 0x01) == 1;
                }
                foreach (var item in Enum.GetValues(typeof(RobotinEnumRobot1)))
                {
                    if (((int)item >= 16 && (int)item <= 39))
                    {
                        if (_robotInStatus[(int)item])
                        {
                            //MachineResource.Instance.MachineCylinder[EnumHelper.GetEnumDescriptionFromValue((RobotinEnumRobot1)item)].On();
                            MachineResource.Instance.MachineCylinder[RobotInEnumRobot1Dict[(int)item]].On();
                        }
                        else
                        {
                            MachineResource.Instance.MachineCylinder[RobotInEnumRobot1Dict[(int)item]].Off();
                        }
                    }
                    else if ((int)item <= 15 || (int)item == 40)
                    {
                        if ((int)item == 40)
                        {

                        }
                        GlobalVariable.RobotStatus[(int)item] = _robotInStatus[(int)item];
                    }
                    else
                    {
                        if ((int)item == 41)
                            GlobalVariable.NeedOpenPrecisionFeedProductVacUp[0] = _robotInStatus[(int)item];
                        else if ((int)item == 42)
                            GlobalVariable.NeedClosePrecisionRecycleProductVacUp[0] = _robotInStatus[(int)item];
                        else if ((int)item == 43)
                            GlobalVariable.NeedOpenPrecisionFeedProductVacDown[0] = _robotInStatus[(int)item];
                        else if ((int)item == 44)
                            GlobalVariable.NeedClosePrecisionRecycleProductVacDown[0] = _robotInStatus[(int)item];
                        else if ((int)item == 45)
                            GlobalVariable.RobotZInNotSafeArea[0] = _robotInStatus[(int)item];
                        else if ((int)item == 46)
                            GlobalVariable.NozzleAlreadyLiftUp[0] = _robotInStatus[(int)item];
                        else if ((int)item == 47)
                            GlobalVariable.NozzleAlreadyLiftDown[0] = _robotInStatus[(int)item];
                        else if ((int)item == 48)
                            GlobalVariable.RobotCylinderWarn[0] = _robotInStatus[(int)item];
                    }
                }

                foreach (var item in Enum.GetValues(typeof(RobotoutEnumRobot1)))
                {
                    if ((int)item >= 16 && (int)item < 40)
                    {
                        writeStatus[(int)item] = MachineResource.Instance.MachineSensor[RobotOutEnumRobot1Dict[(int)item]].WaitOn();
                    }
                    else if ((int)item < 16)
                    {
                        writeStatus[(int)item] = GlobalVariable.RobotControlStatus[(int)item];
                    }
                    else if ((int)item >= 40 && (int)item <= 43)
                    {
                        if ((int)item == 40)
                            writeStatus[(int)item] = GlobalVariable.AlreadyOpenPrecisionFeedProductVacUp[0];
                        else if ((int)item == 41)
                            writeStatus[(int)item] = GlobalVariable.AlreadyClosePrecisionRecycleProductVacUp[0];
                        if ((int)item == 42)
                            writeStatus[(int)item] = GlobalVariable.AlreadyOpenPrecisionFeedProductVacDown[0];
                        else if ((int)item == 43)
                            writeStatus[(int)item] = GlobalVariable.AlreadyClosePrecisionRecycleProductVacDown[0];
                    }
                    else if ((int)item == 44)
                    {
                        writeStatus[(int)item] = GlobalVariable.IsRobotDryRun;
                    }
                    else if ((int)item == 45)
                    {
                        writeStatus[(int)item] = GlobalVariable.AlreadyGrabProductUp[0];
                    }
                    else if ((int)item == 46)
                    {
                        writeStatus[(int)item] = GlobalVariable.AlreadyGrabProductDown[0];
                    }
                    else if ((int)item == 47)
                    {
                        writeStatus[(int)item] = GlobalVariable.AlreadyRobotCylinderWarn[0];
                    }
                }

                int writeVal1 = 0;
                int writeVal2 = 0;
                int writeVal3 = 0;
                int writeVal4 = 0;
                int writeVal5 = 0;
                int writeVal6 = 0;
                int writeVal7 = 0;
                for (int w = 0; w < 8; w++)
                {
                    writeVal1 = setIntegerSomeBit(w, writeVal1, writeStatus[w]);
                }
                for (int w = 0; w < 8; w++)
                {
                    writeVal2 = setIntegerSomeBit(w, writeVal2, writeStatus[w + 8]);
                }
                for (int w = 0; w < 8; w++)
                {
                    writeVal3 = setIntegerSomeBit(w, writeVal3, writeStatus[w + 16]);
                }
                for (int w = 0; w < 8; w++)
                {
                    writeVal4 = setIntegerSomeBit(w, writeVal4, writeStatus[w + 24]);
                }
                for (int w = 0; w < 8; w++)
                {
                    writeVal5 = setIntegerSomeBit(w, writeVal5, writeStatus[w + 32]);
                }
                for (int w = 0; w < 8; w++)
                {
                    writeVal6 = setIntegerSomeBit(w, writeVal6, writeStatus[w + 40]);
                }
                for (int w = 0; w < 8; w++)
                {
                    writeVal7 = setIntegerSomeBit(w, writeVal7, writeStatus[w + 48]);
                }
                _robotReadAddress1.SetData(writeVal1);
                _robotReadAddress2.SetData(writeVal2);
                _robotReadAddress3.SetData(writeVal3);
                _robotReadAddress4.SetData(writeVal4);
                _robotReadAddress5.SetData(writeVal5);
                _robotReadAddress6.SetData(writeVal6);
                _robotReadAddress7.SetData(writeVal7);
                //GC.Collect();
            }
        }
        public override void OnStop()
        {
            base.OnStop();
        }
        public override bool PreStartCheck()
        {
            return base.PreStartCheck();
        }
        private int setIntegerSomeBit(int mask, int a, bool flag)
        {
            if (flag)
            {
                a |= (0x1 << mask);
            }
            else
            {
                a &= ~(0x1 << mask);
            }
            return a;
        }
    }
    public enum RobotinEnumRobot1
    {
        [Description("机器人伺服上电状态")]
        机器人伺服上电状态 = 2,
        [Description("机器人警报状态")]
        机器人警报状态 = 3,
        [Description("机器人自动模式状态")]
        机器人自动模式状态 = 8,
        [Description("机器人程序执行状态")]
        机器人程序执行状态 = 11,
        [Description("机器人程序复位状态")]
        机器人程序复位状态 = 12,
        [Description("机器人1上下气缸1动点V")]
        机器人1上下气缸1动点V = 16,
        [Description("机器人1上下气缸2动点V")]
        机器人1上下气缸2动点V,
        [Description("机器人1上下气缸3动点V")]
        机器人1上下气缸3动点V,
        [Description("机器人1上下气缸4动点V")]
        机器人1上下气缸4动点V,
        [Description("机器人1上下气缸5动点V")]
        机器人1上下气缸5动点V,
        [Description("机器人1上下气缸6动点V")]
        机器人1上下气缸6动点V,
        [Description("机器人1上下气缸7动点V")]
        机器人1上下气缸7动点V,
        [Description("机器人1上下气缸8动点V")]
        机器人1上下气缸8动点V,
        [Description("机器人1真空吸1")]
        机器人1真空吸1,
        [Description("机器人1真空吸2")]
        机器人1真空吸2,
        [Description("机器人1真空吸3")]
        机器人1真空吸3,
        [Description("机器人1真空吸4")]
        机器人1真空吸4,
        [Description("机器人1真空吸5")]
        机器人1真空吸5,
        [Description("机器人1真空吸6")]
        机器人1真空吸6,
        [Description("机器人1真空吸7")]
        机器人1真空吸7,
        [Description("机器人1真空吸8")]
        机器人1真空吸8,
        [Description("机器人1破真空1")]
        机器人1破真空1,
        [Description("机器人1破真空2")]
        机器人1破真空2,
        [Description("机器人1破真空3")]
        机器人1破真空3,
        [Description("机器人1破真空4")]
        机器人1破真空4,
        [Description("机器人1破真空5")]
        机器人1破真空5,
        [Description("机器人1破真空6")]
        机器人1破真空6,
        [Description("机器人1破真空7")]
        机器人1破真空7,
        [Description("机器人1破真空8")]
        机器人1破真空8,
        [Description("Home")]
        机器人回零完成 = 40,
        [Description("精定位上层放料真空开")]
        精定位上层放料真空开,
        [Description("精定位上层取料真空关")]
        精定位上层取料真空关,
        [Description("精定位下层放料真空开")]
        精定位下层放料真空开,
        [Description("精定位下层取料真空关")]
        精定位下层取料真空关,
        [Description("机器人1Z在放取料高度")]
        机器人1Z在放取料高度,
        [Description("机器人1已抬吸嘴上层")]
        机器人1已抬吸嘴上层,
        [Description("机器人1已抬吸嘴下层")]
        机器人1已抬吸嘴下层,
        [Description("机器人1气缸报警")]
        机器人1气缸报警,
    }
    public enum RobotinEnumRobot2
    {
        [Description("机器人伺服上电状态")]
        机器人伺服上电状态 = 2,
        [Description("机器人警报状态")]
        机器人警报状态 = 3,
        [Description("机器人自动模式状态")]
        机器人自动模式状态 = 8,
        [Description("机器人程序执行状态")]
        机器人程序执行状态 = 11,
        [Description("机器人程序复位状态")]
        机器人程序复位状态 = 12,
        [Description("机器人2上下气缸1动点V")]
        机器人2上下气缸1动点V = 16,
        [Description("机器人2上下气缸2动点V")]
        机器人2上下气缸2动点V,
        [Description("机器人2上下气缸3动点V")]
        机器人2上下气缸3动点V,
        [Description("机器人2上下气缸4动点V")]
        机器人2上下气缸4动点V,
        [Description("机器人2上下气缸5动点V")]
        机器人2上下气缸5动点V,
        [Description("机器人2上下气缸6动点V")]
        机器人2上下气缸6动点V,
        [Description("机器人2上下气缸7动点V")]
        机器人2上下气缸7动点V,
        [Description("机器人2上下气缸8动点V")]
        机器人2上下气缸8动点V,
        [Description("机器人2真空吸1")]
        机器人2真空吸1,
        [Description("机器人2真空吸2")]
        机器人2真空吸2,
        [Description("机器人2真空吸3")]
        机器人2真空吸3,
        [Description("机器人2真空吸4")]
        机器人2真空吸4,
        [Description("机器人2真空吸5")]
        机器人2真空吸5,
        [Description("机器人2真空吸6")]
        机器人2真空吸6,
        [Description("机器人2真空吸7")]
        机器人2真空吸7,
        [Description("机器人2真空吸8")]
        机器人2真空吸8,
        [Description("机器人2破真空1")]
        机器人2破真空1,
        [Description("机器人2破真空2")]
        机器人2破真空2,
        [Description("机器人2破真空3")]
        机器人2破真空3,
        [Description("机器人2破真空4")]
        机器人2破真空4,
        [Description("机器人2破真空5")]
        机器人2破真空5,
        [Description("机器人2破真空6")]
        机器人2破真空6,
        [Description("机器人2破真空7")]
        机器人2破真空7,
        [Description("机器人2破真空8")]
        机器人2破真空8,
        [Description("Home")]
        机器人回零完成 = 40,
        [Description("精定位上层放料真空开")]
        精定位上层放料真空开,
        [Description("精定位上层取料真空关")]
        精定位上层取料真空关,
        [Description("精定位下层放料真空开")]
        精定位下层放料真空开,
        [Description("精定位下层取料真空关")]
        精定位下层取料真空关,
        [Description("机器人2Z在放取料高度")]
        机器人2Z在放取料高度,
        [Description("机器人2已抬吸嘴上层")]
        机器人2已抬吸嘴上层,
        [Description("机器人2已抬吸嘴下层")]
        机器人2已抬吸嘴下层,
        [Description("机器人2气缸报警")]
        机器人2气缸报警,
    }
    public enum RobotoutEnumRobot1
    {
        机器人紧急停止 = 0,//常闭
        //机器人伺服上电,
        机器人停止 = 6,//常闭
        机器人程序启动 = 10,
        机器人程序复位 = 13,
        机器人报警复位 = 14,
        [Description("机器人1上下气缸1原点")]
        机器人1上下气缸1原点 = 16,
        [Description("机器人1上下气缸1动点")]
        机器人1上下气缸1动点,
        [Description("机器人1上下气缸2原点")]
        机器人1上下气缸2原点,
        [Description("机器人1上下气缸2动点")]
        机器人1上下气缸2动点,
        [Description("机器人1上下气缸3原点")]
        机器人1上下气缸3原点,
        [Description("机器人1上下气缸3动点")]
        机器人1上下气缸3动点,
        [Description("机器人1上下气缸4原点")]
        机器人1上下气缸4原点,
        [Description("机器人1上下气缸4动点")]
        机器人1上下气缸4动点,
        [Description("机器人1上下气缸5原点")]
        机器人1上下气缸5原点,
        [Description("机器人1上下气缸5动点")]
        机器人1上下气缸5动点,
        [Description("机器人1上下气缸6原点")]
        机器人1上下气缸6原点,
        [Description("机器人1上下气缸6动点")]
        机器人1上下气缸6动点,
        [Description("机器人1上下气缸7原点")]
        机器人1上下气缸7原点,
        [Description("机器人1上下气缸7动点")]
        机器人1上下气缸7动点,
        [Description("机器人1上下气缸8原点")]
        机器人1上下气缸8原点,
        [Description("机器人1上下气缸8动点")]
        机器人1上下气缸8动点,
        [Description("机器人1真空达到1")]
        机器人1真空达到1,
        [Description("机器人1真空达到2")]
        机器人1真空达到2,
        [Description("机器人1真空达到3")]
        机器人1真空达到3,
        [Description("机器人1真空达到4")]
        机器人1真空达到4,
        [Description("机器人1真空达到5")]
        机器人1真空达到5,
        [Description("机器人1真空达到6")]
        机器人1真空达到6,
        [Description("机器人1真空达到7")]
        机器人1真空达到7,
        [Description("机器人1真空达到8")]
        机器人1真空达到8,
        [Description("精定位上层放料真空已开")]
        精定位上层放料真空已开 = 40,
        [Description("精定位上层取料真空已关")]
        精定位上层取料真空已关,
        [Description("精定位下层放料真空已开")]
        精定位下层放料真空已开,
        [Description("精定位下层取料真空已关")]
        精定位下层取料真空已关,
        [Description("空跑标志")]
        空跑标志 = 44,
        [Description("机器人1已夹料上层")]
        机器人1已夹料上层,
        [Description("机器人1已夹料下层")]
        机器人1已夹料下层,
        [Description("机器人1已气缸报警")]
        机器人1已气缸报警,
    }
    public enum RobotoutEnumRobot2
    {
        机器人紧急停止 = 0,//常闭
        //机器人伺服上电,
        机器人停止 = 6,//常闭
        机器人程序启动 = 10,
        机器人程序复位 = 13,
        机器人报警复位 = 14,
        [Description("机器人2上下气缸1原点")]
        机器人2上下气缸1原点 = 16,
        [Description("机器人2上下气缸1动点")]
        机器人2上下气缸1动点,
        [Description("机器人2上下气缸2原点")]
        机器人2上下气缸2原点,
        [Description("机器人2上下气缸2动点")]
        机器人2上下气缸2动点,
        [Description("机器人2上下气缸3原点")]
        机器人2上下气缸3原点,
        [Description("机器人2上下气缸3动点")]
        机器人2上下气缸3动点,
        [Description("机器人2上下气缸4原点")]
        机器人2上下气缸4原点,
        [Description("机器人2上下气缸4动点")]
        机器人2上下气缸4动点,
        [Description("机器人2上下气缸5原点")]
        机器人2上下气缸5原点,
        [Description("机器人2上下气缸5动点")]
        机器人2上下气缸5动点,
        [Description("机器人2上下气缸6原点")]
        机器人2上下气缸6原点,
        [Description("机器人2上下气缸6动点")]
        机器人2上下气缸6动点,
        [Description("机器人2上下气缸7原点")]
        机器人2上下气缸7原点,
        [Description("机器人2上下气缸7动点")]
        机器人2上下气缸7动点,
        [Description("机器人2上下气缸8原点")]
        机器人2上下气缸8原点,
        [Description("机器人2上下气缸8动点")]
        机器人2上下气缸8动点,
        [Description("机器人2真空达到1")]
        机器人2真空达到1,
        [Description("机器人2真空达到2")]
        机器人2真空达到2,
        [Description("机器人2真空达到3")]
        机器人2真空达到3,
        [Description("机器人2真空达到4")]
        机器人2真空达到4,
        [Description("机器人2真空达到5")]
        机器人2真空达到5,
        [Description("机器人2真空达到6")]
        机器人2真空达到6,
        [Description("机器人2真空达到7")]
        机器人2真空达到7,
        [Description("机器人2真空达到8")]
        机器人2真空达到8,
        [Description("精定位上层放料真空已开")]
        精定位上层放料真空已开 = 40,
        [Description("精定位上层取料真空已关")]
        精定位上层取料真空已关,
        [Description("精定位下层放料真空已开")]
        精定位下层放料真空已开,
        [Description("精定位下层取料真空已关")]
        精定位下层取料真空已关,
        [Description("空跑标志")]
        空跑标志 = 44,
        [Description("机器人2已夹料上层")]
        机器人2已夹料上层,
        [Description("机器人2已夹料下层")]
        机器人2已夹料下层,
        [Description("机器人2已气缸报警")]
        机器人2已气缸报警,
    }
}
